package com.spring.demo.springdemo;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Author RenPu
 * @Date 2022/4/10 14:13
 * @Version 1.0
 * @Description:
 **/

@Service
public class RankServiceImpl {


    /**
     * 利用注解@Resource和@Autowired特性,直接获取所有策略类
     * key = @Service的value
     */
//    @Resource
    private static Map<String, Strategy> rankMap=new HashMap<>();

    //使用JDK 8的写法
//    static Map<String, Strategy> rankMap;

    static {

        //使用JDK 8 Stream API创建了一个包含三个元素的流。然后，我们使用collect()方法将这个流转换为一个Map实例。
        // 在collect()方法中，我们使用Map.Entry::getKey和Map.Entry::getValue方法来提取每个元素的键和值。
//        rankMap=Stream.of(
//                new AbstractMap.SimpleEntry<>("LowPrice",new LowPriceRank()),
//                new AbstractMap.SimpleEntry<>("HighRise",new HighRiseRank()),
//                new AbstractMap.SimpleEntry<>("HighPrice",new HighPriceRank()))
//                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        rankMap.put("LowPrice",new LowPriceRank());
        rankMap.put("HighRise",new HighRiseRank());
        rankMap.put("HighPrice",new HighPriceRank());
    }

    /**
     * dataService.getSource() 提供原始的股票数据
//     */
//    @Resource
//    private DataService dataService;


    /**
     * 前端传入榜单类型, 返回排序完的榜单
     *
     * @param rankType 榜单类型 和Service注解的value属性一致
     * @return 榜单数据
     */
    public  List<Stock> getRank(String rankType) {

        // 判断策略是否存在
        if (!rankMap.containsKey(rankType)) {
            throw new IllegalArgumentException("rankType not found");
        }
        // 获得策略实例
        Strategy rank = rankMap.get(rankType);
        // 执行策略
       // return rank.sort(dataService.getSource());

        //此处模拟从数据库拿到的数据封装
        List<Stock> stockList=new ArrayList<>();
        stockList.addAll(Arrays.asList(new Stock("88",35.6,12.0),
                new Stock("56",26.4,17.8),
                new Stock("32",32.4,19.3),
                new Stock("78",59.4,10.3)));
        return rank.sort(stockList);
    }


    public static void main(String[] args) {
        RankServiceImpl rankService = new RankServiceImpl();
        rankService.getRank("LowPrice");
    }
}
